package com.xs.ai.controller;

import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import com.xs.ai.data.BookingClass;
import com.xs.ai.services.BookingTools;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Map;


/**
 * @author xushu
 * @version 1.0
 * @description:
 */
@RestController
@CrossOrigin
public class OpenAiController  {


    public final ChatClient chatClient;

    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String>  generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt()
                .user(message)
                .options(DashScopeChatOptions.builder().withTemperature(0.2F).build())
                .stream()
                .content();
        // 2. 创建心跳流（每15秒发送一个空字符串）
        Flux<String> heartbeat = Flux.interval(Duration.ofSeconds(15))
                .map(tick -> ""); // 空消息不影响前端展示，但能维持连接

        // 3. 合并 AI 响应和心跳流（优先发送 AI 内容）
        return Flux.merge(content, heartbeat)
                // 确保最后发送 [complete] 标记（与前端逻辑对应）
                .concatWith(Flux.just("[complete]"));
    }
public OpenAiController(ChatClient.Builder chatclientBuilder, ChatMemory chatMemory,VectorStore vectorStore){

    String currentDate = LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE); // 格式：2025-09-08
    // 1. 定义带变量的系统提示模板
    String systemTemplate = """
            您是“XuShu”航空公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                					   您正在通过在线聊天系统与客户互动。
                                       在提供有关预订或取消预订的信息之前，您必须始终
                					   从用户处获取以下信息：预订号、客户姓名。
                                       在询问用户之前，请检查消息历史记录以获取此信息。
                                       请讲中文。
                					   今天的日期是 {current_date}.
        """;
    // 3. 使用PromptTemplate替换变量
    PromptTemplate promptTemplate = new PromptTemplate(systemTemplate,
            Map.of("current_date", currentDate) // 传入变量值
    );
    String renderedSystemPrompt = promptTemplate.render(); // 渲染后的模板（已替换变量）
       this.chatClient= chatclientBuilder

               .defaultSystem(renderedSystemPrompt)
               .defaultAdvisors(
                       new PromptChatMemoryAdvisor(chatMemory),
                       new LoggingAdvisor(),
                        new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults())
               ).defaultFunctions("getBookingDetails", "changeBooking", "cancelBooking").build();

}


}
